home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 23 / CU Amiga - Super CD-ROM 23 (June 1998).iso / CUCD / Programming / OUI / slist.cc < prev    next >
Encoding:
C/C++ Source or Header  |  1998-04-08  |  3.7 KB  |  189 lines

  1. // list.cc
  2. // Date de création : 15/07/94
  3. // Auteur : Dominique Lorre
  4.  
  5. #include <exec/types.h>
  6. #include <string.h>
  7.  
  8. #include <proto/dos.h>
  9. #include <mydebug.h>
  10.  
  11. #include "slist.h"
  12.  
  13.  
  14. // =========================================================================
  15. // ========================== SLINK CLASS ==================================
  16. // =========================================================================
  17.  
  18. long slink::type() const
  19. {
  20.     return 0 ;
  21. }   // info for selection
  22.  
  23. slink::~slink()
  24. {
  25. }
  26.  
  27. long slink::indexof()
  28. {
  29. long n = 0 ;
  30. slink *c ;
  31.     c = this ;
  32.     while (c) {
  33.         n++ ;
  34.         c = c->pred ;
  35.     }
  36.     return n-1 ;
  37. }
  38.  
  39. // =========================================================================
  40. // ========================== SLIST CLASS ==================================
  41. // =========================================================================
  42.  
  43. slist::~slist()
  44. {
  45.     free() ;
  46. }
  47.  
  48. void slist::free()
  49. {
  50. slink *n, *c ;
  51.  
  52.     n = head ;
  53.     while (n) {
  54.         c = n->succ ;
  55.         delete n ;
  56.         n = c ;
  57.     }
  58.     init() ;
  59. }
  60.  
  61. void slist::addhead(slink *p)
  62. {
  63.     if (head) {
  64.         head->pred = p ;
  65.         p->succ = head ;
  66.     }
  67.     else {
  68.         tail = p ;
  69.         p->succ = NULL ;
  70.     }
  71.     head = p ;
  72.     p->pred = NULL ;
  73. }
  74.  
  75. void slist::addtail(slink *p)
  76. {
  77.     if (tail) {
  78.         tail->succ = p ;
  79.         p->pred = tail ;
  80.     }
  81.     else {
  82.         head = p ;
  83.         p->pred = NULL ;
  84.     }
  85.     tail = p ;
  86.     p->succ = NULL ;
  87. }
  88.  
  89. void slist::insert(slink *c, slink *p)
  90. {
  91.     if (!p)
  92.         addhead(c) ;
  93.     else if (p == tail)
  94.         addtail(c) ;
  95.     else  {
  96.         c->succ = p->succ ;
  97.         c->pred = p ;
  98.         p->succ->pred = c ;
  99.         p->succ = c ;
  100.     }
  101. }
  102.  
  103.  
  104. void slist::remove(slink *c)
  105. {
  106.     if (c->succ) {                      // le node a un successeur
  107.         if (c->pred) {                  // et un prédécesseur
  108.             c->succ->pred = c->pred ;   // -> ni en tête, ni en fin de liste
  109.             c->pred->succ = c->succ ;
  110.         }
  111.         else {                          // pas de prédécesseur :
  112.             head = c->succ ;            // tête de liste
  113.             c->succ->pred = NULL ;
  114.         }
  115.     }
  116.     else {                              // pas de successeur :
  117.         if (c->pred) {                  // un prédécesseur :
  118.             tail = c->pred ;            // queue de liste
  119.             c->pred->succ = NULL ;
  120.         }
  121.         else if ((c == tail) && (c == head)) {  // ni de prédécesseur
  122.             tail = head = NULL ;            // liste vide
  123.         }                                   // autre cas : le node a été remplacé
  124.     }
  125. }
  126.  
  127. slink * slist::get(long ind)
  128. {
  129. slink *c ;
  130. long n = 0 ;
  131.     c = head ;
  132.     while (c && n<ind) {
  133.         c = c->succ ;
  134.         n++ ;
  135.     }
  136.     return c ;
  137. }
  138.  
  139. void slist::replace(slink *anc, slink *nouv)
  140. {
  141.     nouv->succ = anc->succ ;
  142.     nouv->pred = anc->pred ;
  143.     if (nouv->succ)  nouv->succ->pred = nouv ;
  144.     if (nouv->pred)  nouv->pred->succ = nouv ;
  145.     if (anc == head) head = nouv ;
  146.     if (anc == tail) tail = nouv ;
  147.     anc->succ = NULL ;
  148.     anc->pred = NULL ;
  149. }
  150.  
  151.  
  152.  
  153. long slist::count()
  154. {
  155. slink *c = head ;
  156. long n = 0 ;
  157.     while (c) {
  158.         n++ ;
  159.         c = c->succ ;
  160.     }
  161.     return n ;
  162. }
  163.  
  164. // =========================================================================
  165. // ========================== NLIST CLASS ==================================
  166. // =========================================================================
  167.  
  168. nlink *nlist::findname(STRPTR name)
  169. {
  170. nlink *c = first() ;
  171.  
  172.     while (c && strcmp(c->label, name))
  173.         c = c->next() ;
  174.     return c ;
  175. }
  176.  
  177. void nlist::enqueue(nlink *node)
  178. {
  179. nlink *c = first() ;
  180.  
  181.     while (c && (stricmp(c->label, node->label) < 0)) {
  182.         c = c->next() ;
  183.     }
  184.     if (!c)
  185.         addtail(node) ;
  186.     else
  187.         insert(node, c->prev()) ;
  188. }
  189.